package world;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.Random;

import sim.SimulationParameters;
import ui.Grafikobjekt;
import util.Hilfsklasse;
import animal.Ameise;

/**
 * Ein Objekt dieser Klasse stellt einen Ameisenhaufen dar.
 * 
 * @author Michael Schoell, Simone Huber
 * 
 */
public class Ameisenhaufen extends Grafikobjekt /* A3, Aufgabe 1 */ {

	private SimulationParameters simParam = new SimulationParameters();
	private String graphikAmeise;
	private int futtereinheiten;
	private long letzteGeburtszeit;
	private Random generator = new Random();

	private String bezeichnung;
	
	private String grafikAmeisenhaufen = "grafiken/ameisenhaufen1.png";
	
	
	/**
	 * Liefert die Bezeichnung des Ameisenhaufens.
	 * 
	 * @return die Bezeichnung des Ameisenhaufens
	 */
	public String getBezeichnung() {
		return bezeichnung;
	}

	
	/**
	 * Setzt die Bezeichnung des Ameisenhaufens.
	 * 
	 * @param bezeichnung
	 *            die Bezeichnung des Ameisenhaufens
	 */
	public void setBezeichnung(String bezeichnung) {
		this.bezeichnung = bezeichnung;
	}

	
	/**
	 * Erzeugt einen Ameisenhaufen und initialisiert dessen Eigenschaften.
	 * 
	 * @param posX
	 *            die x-Koordinate des Ameisenhaufens
	 * @param posY
	 *            die y-Koordinate des Ameisenhaufens
	 * @param bezeichnung
	 *            die Bezeichnung des Ameisenhaufens
	 */
	public Ameisenhaufen(double posX, double posY, String bezeichnung) {
		super();
		setGrafikAmeisenhaufen(grafikAmeisenhaufen); // !!!
		this.bezeichnung = bezeichnung;
		setX(posX);
		setY(posY);
		super.setBeschriftung(bezeichnung);
	}

	
	/**
	 * Liefert die aktuell im Ameisenhaufen vorhandenen Futtereinheiten.
	 * 
	 * @return die aktuell im Ameisenhaufen vorhandenen Futtereinheiten
	 */
	public int getFuttereinheiten() {
		return futtereinheiten;
	}

	
	/**
	 * Setzt die aktuell im Ameisenhaufen vorhandene Anzahl an Futtereinheiten.
	 * Hinweis: Eine negative Anzahl an Futtereinheiten ist nicht moeglich.
	 * 
	 * @param futtereinheiten
	 *            die aktuell im Ameisenhaufen vorhandene Anzahl an
	 *            Futtereinheiten 
	 */
	public void setFuttereinheiten(int futtereinheiten) {
		if(futtereinheiten >= 0){
			this.futtereinheiten = futtereinheiten;
		}
	}

	
	/**
	 * Liefert die Menge an neugeborenen Ameisen
	 * 
	 * @return die Menge an neugeborenen Ameisen
	 */
	public ArrayList<Ameise> gibGeboreneAmeisen() {
		int maxAnzahlNeueAmeisen = futtereinheiten / 10;
		ArrayList<Ameise> ameisen = new ArrayList<Ameise>();
		if (GregorianCalendar.getInstance().getTimeInMillis()
				- letzteGeburtszeit > 10000) {
			int anzahl = generator.nextInt(maxAnzahlNeueAmeisen + 1);
			for (int i = 0; i < anzahl; i++) {
				Ameise neueAmeise;
				if (graphikAmeise != null) {
					neueAmeise = new Ameise(graphikAmeise);
				} else {
					neueAmeise = new Ameise();
				}
				neueAmeise.setAmeisenhaufen(this);
				neueAmeise.setX(getX());
				neueAmeise.setY(getY());
				neueAmeise.setDrehung(Hilfsklasse.getZufallsDouble(2 * Math.PI));
				ameisen.add(neueAmeise);
			}
			futtereinheiten -= anzahl * 10;
			letzteGeburtszeit = GregorianCalendar.getInstance()
					.getTimeInMillis();
		}
		return ameisen;
	}

	
	/**
	 * Liefert die Grafik fuer die Art von Ameisen, die zum Ameisenhaufen
	 * gehoeren.
	 * 
	 * @return die Grafik fuer die Art von Ameisen, die zum Ameisenhaufen
	 *         gehoeren
	 */
	public String getGrafikAmeise() {
		return graphikAmeise;
	}

	
	/**
	 * Setzt die Grafik fuer die Art von Ameisen, die zum Ameisenhaufen
	 * gehoeren.
	 * 
	 * @param graphikAmeise
	 *            die Grafik fuer die Art von Ameisen, die zum Ameisenhaufen
	 *            gehoeren
	 */
	public void setGrafikAmeise(String graphikAmeise) {
		this.graphikAmeise = graphikAmeise;
	}

	
	/**
	 * Gibt den Anfangsbestand an Ameisen des Ameisenhaufens zurueck.
	 * 
	 * @return der Anfangsbestand der Ameisen des Ameisenhaufens
	 */
	public ArrayList<Ameise> gibAnfangsbestand() {
		ArrayList<Ameise> anfangsbestand = new ArrayList<Ameise>();
		for (int i = 0; i < simParam.getAnfangsbestandAmeisen(); i++) {
			Ameise a;
			if (this.graphikAmeise != null) {
				a = new Ameise();
				a.setGrafik(graphikAmeise);
			} else {
				a = new Ameise();
			}
			a.setAmeisenhaufen(this);
			a.setX(getX());
			a.setY(getY());
			a.setDrehung(Hilfsklasse.getZufallsDouble(2 * Math.PI));
			anfangsbestand.add(a);
		}
		return anfangsbestand;
	}
	
	
	/**
	 * Setzt die Grafik des Ameisenhaufens neu.
	 * 
	 *@param grafikAmeisenhaufen Die neue Grafik;
	 */
	public void setGrafikAmeisenhaufen(String grafikAmeisenhaufen) {
		this.grafikAmeisenhaufen = grafikAmeisenhaufen;
		setGrafik(grafikAmeisenhaufen);
	}
	


}
